import { Injectable, InternalServerErrorException } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import configuration from 'config/configuration';
import * as path from 'path';
import * as crypto from 'crypto';
import axios from 'axios';
// import { importDynamic } from '@/utils/gradio';
// const axios = require('axios');
const OSS = require('ali-oss');
// const WebSocket = require('ws');
// const fs = require('fs');
// const uuid = require('uuid').v4;

// // WebSocket服务器地址
// const url = 'wss://dashscope.aliyuncs.com/api-ws/v1/inference/';
// // 输出文件路径
// const outputFilePath = 'output.mp3';

const { accessKeyId, accessKeySecret } = configuration.alioss;

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
  region: 'oss-cn-beijing',
  // 从环境变量中获取AccessKey ID的值
  accessKeyId: accessKeyId,
  // 从环境变量中获取AccessKey Secret的值
  accessKeySecret: accessKeySecret,
  // yourbucketname填写存储空间名称。
  bucket: 'jgn',
});


@Injectable()
export class OssService {
  constructor(private readonly httpService: HttpService) {}

    /**
   * 上传文件到OSS
   * @param url - 文件url
   * @param filename - 原始文件名
   * @returns 上传后的文件URL
   */
    async uploadFileByUrl(url: string, filename: string): Promise<string> {
      try {
        const response = await axios.get(url, { responseType: 'arraybuffer'});
        const file = Buffer.from(response.data);
        // 生成唯一的文件名
        const ext = path.extname(filename);
        const hash = crypto.createHash('md5').update(Date.now().toString()).digest('hex');
        const ossFilename = `task-project/${hash}${ext}`;
  
        // 上传文件到OSS
        const result = await client.put(ossFilename, file, {
          headers: {
            'Content-Type': this.getContentType(ext),
            // 设置为公共读
            'x-oss-object-acl': 'public-read',
          },
          timeout: 60000 * 5
        });
  
        // 返回文件访问URL,把http://改成https://
        return result.url.replace('http://', 'https://');
  
      } catch (error) {
        console.error('上传文件失败:', error);
        throw new InternalServerErrorException('上传文件失败');
      }
    }


  /**
   * 上传文件到OSS
   * @param file - 文件Buffer
   * @param filename - 原始文件名
   * @returns 上传后的文件URL
   */
  async uploadFile(file: Buffer, filename: string): Promise<string> {
    try {
      // 生成唯一的文件名
      const ext = path.extname(filename);
      const hash = crypto.createHash('md5').update(Date.now().toString()).digest('hex');
      const ossFilename = `task-project/${hash}${ext}`;

      // 上传文件到OSS
      const result = await client.put(ossFilename, file, {
        headers: {
          'Content-Type': this.getContentType(ext),
          // 设置为公共读
          'x-oss-object-acl': 'public-read',
        }
      });

      // 返回文件访问URL,把http://改成https://
      return result.url.replace('http://', 'https://');

    } catch (error) {
      console.error('上传文件失败:', error);
      throw new InternalServerErrorException('上传文件失败');
    }
  }

  /**
   * 根据文件扩展名获取Content-Type
   */
  private getContentType(ext: string): string {
    const contentTypes = {
      '.mp3': 'audio/mpeg',
      '.wav': 'audio/wav',
      '.m4a': 'audio/mp4',
      '.mp4': 'video/mp4',
      '.mov': 'video/quicktime',
      '.png': 'image/png',
      '.jpg': 'image/jpeg',
      '.jpeg': 'image/jpeg',
      '.gif': 'image/gif',
      '.bmp': 'image/bmp',
      '.webp': 'image/webp',
      
    };
    return contentTypes[ext.toLowerCase()] || 'application/octet-stream';
  }


//   async getPromptText() {
//     try {
//       console.log("1");
//       const response = await fetch(
//         'https://jgn.oss-cn-beijing.aliyuncs.com/ai-entrepreneur-tool/479a8be2fc6d1360c072e036b3e97b3d.m4a',
//       );
//       console.log("2");
//       const audioBlob = await response.blob();
//       // console.log(audioBlob);
//       console.log("3");

//       const inputData = [await audioBlob.text()]
//       // console.log(inputData);
//       // 发送初始请求
//       let eventId;
//       const predictResponse = await axios.post(
//         'https://lazyboyjgn-cosyvoice2-0-5b.ms.show/gradio_api/call/generate_seed',
//         {
//           data: inputData
//         }
//       ).then(res => {
//         console.log("4");
//         console.log(res);
//         const event_id = res?.data?.event_id;
//         console.log("5");
//         console.log('获取到 event_id:', event_id);
//         eventId = event_id;
//         return event_id;
//       });
//       // const predictResponse = await fetch(
//       //   'https://lazyboyjgn-cosyvoice2-0-5b.ms.show/gradio_api/call/generate_seed',
//       //   {
//       //     method: 'POST',
//       //     headers: {
//       //       'Content-Type': 'application/json',
//       //       // 'Authorization': 'Bearer 0fd1e2d6-16be-4f8b-bfc7-d6e289097c51=',
//       //       // 'token': '0fd1e2d6-16be-4f8b-bfc7-d6e289097c51'
//       //     },
//       //     body: JSON.stringify({
//       //       data: [
//       //         await audioBlob.text()
//       //       ],
//       //       fn_index: 0
//       //     })
//       //   }
//       // );

//       // const event_id = res.event_id;
//       // console.log('获取到 event_id:', event_id);
// // zoh7oMmGHwSUnWxUBMyd git token
//       // 轮询结果
//       let result;
//       while (true) {
//         console.log("6");
//         const predictResponse = await axios.get(
//           'https://lazyboyjgn-cosyvoice2-0-5b.ms.show/gradio_api/queue/status?event_id='+eventId,

//         ).then(res => {
//           console.log("7");
//           console.log(res.data);

//           return res;
//         });

//         // const resultResponse = await fetch(
//         //   `https://lazyboyjgn-cosyvoice2-0-5b.ms.show/gradio_api/queue/status`,
//         //   {
//         //     // headers: {
//         //     //   'Authorization': 'Bearer 0fd1e2d6-16be-4f8b-bfc7-d6e289097c51=',
//         //     //   'token': '0fd1e2d6-16be-4f8b-bfc7-d6e289097c51'
//         //     // }
//         //   }
//         // );
        
//         // result = await resultResponse.json();
//         // console.log(result);
//         if (result?.status === 'finished') {
//           break;
//         }
        
//         // 等待一秒后再次查询
//         await new Promise(resolve => setTimeout(resolve, 1000));
//       }

//       // console.log('最终结果:', result);
//       return result;

//     } catch (error) {
//       // console.error('完整错误:', error);
//       throw error;
//     }
//   }
  // curl -X POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization \
  // -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
  // -H "Content-Type: application/json" \
  // -d '{
  //     "model": "voice-enrollment",
  //     "input": {
  //             "action": "create_voice",
  //             "target_model": "cosyvoice-v1",
  //             "prefix": "testpfx",
  //             "url": "https://your-audio-file-url"
  //         }
  // }'
  // /**
  //  * 创建声音克隆任务
  //  * @param audioBuffer - 音频文件buffer
  //  * @returns 任务ID
  //  */
  // async createVoiceCloneTask(): Promise<string> {
  //   try {
  //     const response = await axios.post(
  //       'https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization',
  //       {
  //         model:"voice-enrollment",
  //         input:{
  //           action:"create_voice",
  //           target_model:"cosyvoice-v1",
  //           prefix:"testpfx",
  //           url:"https://jgn.oss-cn-beijing.aliyuncs.com/ai-entrepreneur-tool/479a8be2fc6d1360c072e036b3e97b3d.m4a"
  //         }
  //       },
  //       {
  //         headers: {
  //           'Content-Type': 'application/json',
  //           'Authorization': `Bearer ${token}`
  //         }
  //       }
  //     );
  //     console.log(response.data);
  //     // data: {
  //     //   output: { voice_id: 'cosyvoice-testpfx-a6a4dba0cfd24d39a2211df8873f3244' },
  //     //   usage: { count: 1 },
  //     //   request_id: '1ebe1fd7-8616-918d-8a64-7a25a3b44d31'
  //     // }
  //     return response.data.taskId;
  //   } catch (error) {
  //     console.error('创建声音克隆任务失败:', error);
  //     throw new InternalServerErrorException('创建声音克隆任务失败');
  //   }
  // }

  //curl -X POST https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization \
  // -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
  // -H "Content-Type: application/json" \
  // -d '{
  //     "model": "voice-enrollment",
  //     "input": {
  //                 "action": "list_voice",
  //                 "prefix": null,
  //                 "page_index": 0,
  //                 "page_size": 10
  //             }
  // }'
  // /**
  //  * 查询所有音色
  //  * @param taskId - 任务ID
  //  * @returns 任务状态和结果
  //  */
  // async getVoiceCloneStatus(taskId: string) {
  //   try {
  //     const response = await axios.post(
  //       `https://dashscope.aliyuncs.com/api/v1/services/audio/tts/customization`,
  //       {
  //         model:"voice-enrollment",
  //         input:{
  //           action:"list_voice",
  //           prefix:null,
  //           page_index:0,
  //           page_size:10
  //         }
  //       },
  //       {
  //         headers: {
  //           'Content-Type': 'application/json',
  //           'Authorization': `Bearer sk-738e987a5a2b4070b502b1bd7afe2e3f`
  //         }
  //       }
  //     );
  //     console.log(response.data);
  //     return response.data;
  //   } catch (error) {
  //     console.error('查询所有音色失败:', error);
  //     throw new InternalServerErrorException('查询所有音色失败');
  //   }
  // }

  // /**
  //  * 使用克隆声音合成语音
  //  * @param text - 要合成的文本
  //  * @param voiceId - 声音ID
  //  * @returns 合成的音频URL
  //  */
  // async synthesizeVoice(text: string, voiceId: string): Promise<string> {
  //   try {
  //     const response = await axios.post(
  //       'https://bailian.aliyuncs.com/v2/api/cosyvoice/tts',
  //       {
  //         text,
  //         voice_id: voiceId
  //       },
  //       {
  //         headers: {
  //           'Content-Type': 'application/json',
  //           'Authorization': `Bearer ${accessKeyId}:${accessKeySecret}`
  //         }
  //       }
  //     );
  //     return response.data.audio_url;
  //   } catch (error) {
  //     console.error('语音合成失败:', error);
  //     throw new InternalServerErrorException('语音合成失败');
  //   }
  // }

  // /**
  //  * 获取可用的声音列表
  //  * @returns 声音列表
  //  */
  // async getVoiceList() {
  //   try {
  //     const response = await axios.get(
  //       'https://bailian.aliyuncs.com/v2/api/cosyvoice/voices',
  //       {
  //         headers: {
  //           'Authorization': `Bearer ${accessKeyId}:${accessKeySecret}`
  //         }
  //       }
  //     );
  //     return response.data.voices;
  //   } catch (error) {
  //     console.error('获取声音列表失败:', error);
  //     throw new InternalServerErrorException('获取声音列表失败');
  //   }
  // }
}
